5.10. GCC-4.8.2 - Pass 2

El paquete GCC contiene la colección de compiladores GNU, que incluye los compiladores C y C++ .

Tiempo aproximado de construcción: 7.1 SBU
Espacio requerido en disco: 1.8 GB

5.10.1. Instalación de GCC

Nuestra primera compilación de GCC ha instalado un par de encabezados internos del sistema . Normalmente uno de ellos, limits.h será el que a su vez incluya la cabecera limits.h del sistema correspondiente , en este caso , /tools/include/limits.h . Sin embargo , en el momento de la primera compilación de gcc /tools/include/limits.h no existía , por lo que la cabecera interna que GCC ha instalado es un archivo parcial , autónomo y no incluye las funciones ampliadas de la cabecera del sistema . Esto fue suficiente para la construcción de la libc temporal, pero esta construcción de GCC ahora requiere la cabecera interna completa . Creamos una versión completa de la cabecera interna utilizando un comando que es idéntico a lo que hace el sistema de compilación de GCC en circunstancias normales:

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

Para las máquinas x86 , una construcción de arranque de GCC utiliza el fomit-frame-pointer compiler flag . Construcciones non-bootstrap omiten dicha opción , y el objetivo debe ser producir un compilador que es exactamente el mismo que si se tratara de bootstrap . Aplica el siguiente comando sed para forzar la construcción que use el flag:

case `uname -m` in
  i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in ;;
esac

Una vez más, cambia la localización del enlazador dinámico de GCC para usar la instalada en /tools.

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

Al igual que en la primera versión de GCC, se requieren los paquetes GMP, MPFR y MPC . Descomprime los archivos de código y los traslada a los nombres de los directorios necesarios:

tar -Jxf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -Jxf ../gmp-5.1.3.tar.xz
mv -v gmp-5.1.3 gmp
tar -zxf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

Cree un directorio de construcción dedicado:

mkdir -v ../gcc-build
cd ../gcc-build

Antes de iniciar la construcción de GCC , recuerda desactivar cualquier variable de entorno que modifique las opciones de optimización por defecto.

Ahora, prepara GCC para su compilación:

CC=$LFS_TGT-gcc                                      \
CXX=$LFS_TGT-g++                                     \
AR=$LFS_TGT-ar                                       \
RANLIB=$LFS_TGT-ranlib                               \
../gcc-4.8.2/configure                               \
    --prefix=/tools                                  \
    --with-local-prefix=/tools                       \
    --with-native-system-header-dir=/tools/include   \
    --enable-clocale=gnu                             \
    --enable-shared                                  \
    --enable-threads=posix                           \
    --enable-__cxa_atexit                            \
    --enable-languages=c,c++                         \
    --disable-libstdcxx-pch                          \
    --disable-multilib                               \
    --disable-bootstrap                              \
    --disable-libgomp                                \
    --with-mpfr-include=$(pwd)/../gcc-4.8.2/mpfr/src \
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs

El significado de las nuevas opciones de configure:

--enable-clocale=gnu

Esta opción asegura que el modelo de locales correcto está seleccionado para las bibliotecas de C++ en todas las circunstancias . Si el script configure encuentra instalada la locale de_DE , seleccionará el modelo correcto de gnu . Sin embargo , si la configuración regional de_DE no está instalada, se corre el riesgo de construir interfaz binaria de aplicación (ABI ) incompatibles con bibliotecas de C++ debido a que el modelo de locales genérico incorrecto puede ser seleccionado.

--enable-threads=posix

Esto permite la manipulación C++ para el código de excepción multi-hilo

--enable-__cxa_atexit

Esta opción permite el uso de __ cxa_atexit , en lugar de atexit , para registrar destructores C++ para objetos estáticos locales y objetos globales . Esta opción es esencial para un manejo totalmente compatible con los estándares de los destructores . También afecta a la C++ ABI , y por lo tanto da lugar a bibliotecas C++ compartidas y programas C++ interoperables con otras distribuciones Linux .

--enable-languages=c,c++

Esta opción garantiza que tanto el C y C++ compiladores puedan ser construidos.

--disable-libstdcxx-pch

No construye la cabecera precompilada ( PCH ) para libstdc++ . Se necesita una gran cantidad de espacio, y no tenemos ningún uso para él .

--disable-bootstrap

Para construcciones nativas de GCC , lo predeterminado es hacer un build "bootstrap " . Esto no sólo compila GCC , sino que lo compila varias veces. Usa los programas compilados la primera vez para compilarse a sí mismo una segunda vez , y luego otra vez por tercera vez. La segunda y tercera iteraciones son comparados para asegurarse que puede reproducirse a sí mismo sin errores . Esto también implica que se ha compilado correctamente . Sin embargo , el método de construcción de LFS debe proporcionar un compilador sólido, sin la necesidad de arrancar cada vez .

Compila the paquete:

make

Instala el paquete:

make install

Como toque final, crea un enlace simbólico . Muchos programas y scripts ejecutan cc en vez de gcc, que se utiliza para los programas que sean genéricos y por tanto utilizables en toda clase de sistemas UNIX donde no siempre se instala el compilador de C de GNU . Ejecutar cc deja al administrador del sistema libre de decidir qué compilador de C instalar:

ln -sv gcc /tools/bin/cc
[Caution]

ATENCIÓN

En este punto , es obligatorio parar y asegurarse de que las operaciones básicas (compilación y enlazado) de las nuevas herramientas funcionan como se esperaba. Para llevar a cabo una comprobación de validez , ejecute los siguientes comandos :

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser de la forma:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

Tenga en cuenta que /tools/lib, o /tools/lib64 para equipos de 64 bits aparece como el prefijo de tu enlazador dinámico.

Si la salida no se muestra como arriba, o no hay salida alguna , algo está mal. Investiga y sigue los pasos para averiguar dónde está el problema y corregirlo. Este problema se debe resolver antes de continuar . En primer lugar, realiza la comprobación de sanidad usando gcc en vez de cc . Si esto funciona, entonces el enlace simbólico /tools/bin/cc no se encuentra. Instala el enlace simbólico a lo anterior . A continuación, asegúrate de que la ruta es correcta . Esto se puede comprobar ejecutando echo $PATH y verificando que /tools/bin está en cabeza de la lista. Si el PATH está mal puede significar que no estás en el sistema como usuario lfs o que algo salió mal en la Sección 4.4, " Configuración del entorno ".

Una vez que todo esté bien, borra los ficheros de prueba :

rm -v dummy.c a.out

Los detalles sobre este paquete se encuentran en la Sección 6.17.2 , "Contenido de GCC ".